/**
 *	@file	pgear_tel.c
 *	@brief	ポケギア　電話アプリ
 *	@author	Miyuki Iwasawa
 *	@date	07.06.21
 *
 */

#include "common.h"
#include "system/procsys.h"
#include "system/arc_util.h"
#include "system/arc_tool.h"
#include "system/brightness.h"
#include "system/bmp_list.h"
#include "system/bmp_menu.h"
#include "system/pm_str.h"
#include "system/msgdata.h"
#include "system/fontproc.h"
#include "system/snd_tool.h"
#include "system/clact_util.h"
#include "system/clact_tool.h"
#include "system/render_oam.h"
#include "system/wipe.h"
#include "system/buflen.h"
#include "system/pmfprint.h"
#include "gflib/touchpanel.h"
#include "field/field_matrix.h"
#include "field/field_place_name.h"
#include "application/app_tool.h"
#include "application/pokegear.h"
#include "msgdata/msg.naix"
#include "msgdata/msg_pg_tel.h"

#include "../pgear_sys.h"
#include "../pgear_frm.h"
#include "pgtel_sys.h"
#include "pgtel_bg.h"
#include "pgtel_sub.h"
#include "pgtel_key.h"
#include "pgtel_list.h"


//プロトタイプ宣言　グローバル
//================================================================
///オーバーレイプロセス定義
PROC_RESULT PGearTelProc_Init( PROC *proc,int *seq);
PROC_RESULT PGearTelProc_Main( PROC *proc,int *seq);
PROC_RESULT PGearTelProc_End( PROC *proc,int *seq);

//プロトタイプ宣言　ローカル
//
static void tel_InitDataSet(PGTEL_SYS_WORK* wk);
static void tel_LastDataSet(PGTEL_SYS_WORK* wk);

static int telseq_AppInit(PGTEL_SYS_WORK* wk);
static int telseq_AppMain(PGTEL_SYS_WORK* wk);
static int telseq_AppEnd(PGTEL_SYS_WORK* wk);
static int telseq_ListSelect(PGTEL_SYS_WORK* wk);
static int telseq_ListSortMode(PGTEL_SYS_WORK* wk);
static int telseq_ListSort(PGTEL_SYS_WORK* wk);
static int telseq_TalkSet(PGTEL_SYS_WORK* wk);
static int telseq_TalkStart(PGTEL_SYS_WORK* wk);
static int telseq_TalkWait(PGTEL_SYS_WORK* wk);
static int telseq_TalkEnd(PGTEL_SYS_WORK* wk);
static int telseq_AllFadeIn(PGTEL_SYS_WORK* wk);
static int telseq_AllFadeOut(PGTEL_SYS_WORK* wk);
static int telseq_ViewFadeIn(PGTEL_SYS_WORK* wk);
static int telseq_ViewFadeOut(PGTEL_SYS_WORK* wk);




//================================================================
/**
 *	@brief	ポケギア マッププロセス初期化
 *	@param	proc	プロセスデータ
 *	@param	seq		シーケンス
 *
 *	@return	処理状況
 */
PROC_RESULT PGearTelProc_Init( PROC *proc,int *seq)
{
	PGTEL_SYS_WORK *wk = NULL;
	PGEAR_SYS_WORK * sys_wk = (PGEAR_SYS_WORK*)PROC_GetParentWork(proc);

	//ワークエリア取得
	HeapStatePush();

	//ヒープ作成
	sys_CreateHeap(HEAPID_BASE_APP,HEAPID_PGEAR_APP,0x30000);

	wk = PROC_AllocWork( proc,sizeof(PGTEL_SYS_WORK),HEAPID_PGEAR_APP);
	memset(wk,0,sizeof(PGTEL_SYS_WORK));

	//パラメータ引継ぎ
	wk->sys = sys_wk;
	wk->heapID = HEAPID_PGEAR_APP;

	//サウンド引継ぎ設定
	Snd_DataSetByScene( SND_SCENE_SUB_TOWNMAP, 0, 0 );

	//初期パラメータゲット
	tel_InitDataSet(wk);

	return PROC_RES_FINISH;
}

/**
 *	@brief	ポケギア　マッププロセスメイン
 *	@param	proc	プロセスデータ
 *	@param	seq		シーケンス
 *
 *	@return 処理状況
 */
PROC_RESULT PGearTelProc_Main(PROC* proc,int *seq)
{
	PGTEL_SYS_WORK* wk = PROC_GetWork(proc);

	switch(*seq){
	case PGTEL_SEQ_INIT:
		*seq = telseq_AppInit(wk);
		break;
	case PGTEL_SEQ_MAIN:
		*seq = telseq_AppMain(wk);
		break;
	case PGTEL_SEQ_END:
		*seq = telseq_AppEnd(wk);
		break;
	case PGTEL_SEQ_LIST_SELECT:
		*seq = telseq_ListSelect(wk);
		break;
	case PGTEL_SEQ_LIST_SORT_MODE:
		*seq = telseq_ListSortMode(wk);
		break;
	case PGTEL_SEQ_LIST_SORT:
		*seq = telseq_ListSort(wk);
		break;
	case PGTEL_SEQ_TALK_SET:
		*seq = telseq_TalkSet(wk);
		break;
	case PGTEL_SEQ_TALK_START:
		*seq = telseq_TalkStart(wk);
		break;
	case PGTEL_SEQ_TALK_WAIT:
		*seq = telseq_TalkWait(wk);
		break;
	case PGTEL_SEQ_TALK_END:
		*seq = telseq_TalkEnd(wk);
		break;
	case PGTEL_SEQ_ALL_FADEIN:
		*seq = telseq_AllFadeIn(wk);
		break;
	case PGTEL_SEQ_ALL_FADEOUT:
		*seq = telseq_AllFadeOut(wk);
		break;
	case PGTEL_SEQ_VIEW_FADEIN:
		*seq = telseq_ViewFadeIn(wk);
		break;
	case PGTEL_SEQ_VIEW_FADEOUT:
		*seq = telseq_ViewFadeOut(wk);
		break;
	case PGTEL_SEQ_APP_EXIT:
		return PROC_RES_FINISH;
	}
	return PROC_RES_CONTINUE;
}

/**
 *	@brief	ポケギア　メインプロセス終了
 *
 *	@param	proc	プロセスデータ
 *	@param	seq		シーケンス
 *
 *	@return 処理状況
 */
PROC_RESULT PGearTelProc_End(PROC* proc,int* seq)
{
	int heapID = 0;
	PGTEL_SYS_WORK* wk = PROC_GetWork(proc);

	//セーブデータ反映
	tel_LastDataSet(wk);

	//アプリケーション初回呼び出し終了フラグを立てておく
	wk->sys->call_end = 1;

	//ワークエリア開放
	heapID = wk->heapID;
	PROC_FreeWork(proc);

	HeapStatePop();
	HeapStateCheck(heapID);
	sys_DeleteHeap(heapID);

	return PROC_RES_FINISH;
}

/**
 *	@brief	アプリ初期化データ取得
 */
static void tel_InitDataSet(PGTEL_SYS_WORK* wk)
{
	//システムにアプリワークポインタを通知
	wk->sys->app_vwork = (void*)wk;

	//システムにSysKey2AppKey描画の切替関数ポインタを通知
	wk->sys->to_akey_func = PGTelSub_ToKeyChange;
//	wk->sys->to_touch_func = PGTelSub_ToTouchChange;

	//現在の選択スキンを取得
	wk->skin = PGearSv_GetSkin(wk->sys->pg_save);

	//今は強制的に0
//	wk->skin = 0;
	IWASAWA_PRINT(" PokeGear Skin = %d\n",wk->skin);

	//電話帳データ取得
	wk->tbook = PGearSv_GetTelBook(wk->sys->pg_save,wk->heapID);
	wk->entryNum = PGearSv_GetTelBookEntryNum(wk->sys->pg_save);

	//電話リスト取得
	PGTelList_InitList(wk);

	//引継ぎパラメータ取得
	if(wk->sys->param->mode == PGEAR_CALL_TEL){	//着信モード
		wk->is_call = TRUE;
		wk->target = wk->sys->param->tel_number;
		wk->ev_type = wk->sys->param->tel_type;
		wk->ev_id = wk->sys->param->tel_id;
		wk->sys->control = PGCONT_APP;
	}else{
		wk->is_call = FALSE;
		wk->target = 0;
		wk->ev_type = TEL_CALL_NORMAL;
		wk->ev_id = 0;
	}
}

/**
 *	@brief	セーブデータ反映
 */
static void tel_LastDataSet(PGTEL_SYS_WORK* wk)
{
	//電話リスト解放＆セーブデータ反映
	PGTelList_ReleaseList(wk);

	//電話帳データ解放
	sys_FreeMemoryEz(wk->tbook);

	wk->sys->to_akey_func = NULL;
	wk->sys->to_touch_func = NULL;
}


/**
 *	@brief	ポケギア電話　シーケンス初期化
 */
static int telseq_AppInit(PGTEL_SYS_WORK* wk)
{
	if(!PGTel_AppInit(wk)){
		return PGTEL_SEQ_INIT;
	}

	if(wk->sys->call_end){
		return PGTEL_SEQ_VIEW_FADEIN;
	}else{
		return PGTEL_SEQ_ALL_FADEIN;
	}
}

/**
 *	@brief	ポケギア電話　シーケンス終了
 */
static int telseq_AppMain(PGTEL_SYS_WORK* wk)
{
	int ret = PG_NEXT_NULL;

	ret = PGTelKey_ContTouch(wk);
	if(ret == PG_NEXT_NULL){
		if(!wk->input_f){	//スクロール中はキー＆タッチの入れ替えしない
			PGFrame_ChangeKeyModeCheck(wk->sys);
		}
		if(wk->sys->control == PGCONT_SYS){
			ret = PGFrame_SysKeyControl(wk->sys);
		}else{
			ret = PGTelKey_ContKey(wk);
		}
	}

	switch(ret){
	case PG_NEXT_NULL:
		break;
	case PG_NEXT_EXIT:
		wk->sys->next_mode = ret;
		return PGTEL_SEQ_ALL_FADEOUT;
	case PG_NEXT_APP_SEQ:
		return PGTEL_SEQ_LIST_SELECT;
	default:
		wk->sys->next_mode = ret;
		return PGTEL_SEQ_VIEW_FADEOUT;
	}
	return PGTEL_SEQ_MAIN;
}

/**
 *	@brief	ポケギア電話　シーケンス終了
 */
static int telseq_AppEnd(PGTEL_SYS_WORK* wk)
{
	if(!PGTel_AppEnd(wk)){
		return PGTEL_SEQ_END;
	}

	return PGTEL_SEQ_APP_EXIT;
}

/**
 *	@brief	ポケギア電話　セレクトボックス　選択待ち
 */
static int telseq_ListSelect(PGTEL_SYS_WORK* wk)
{
	return PGTel_ListSelect(wk);
}

/**
 *	@brief	ポケギア電話　リストソートモード選択待ち
 */
static int telseq_ListSortMode(PGTEL_SYS_WORK* wk)
{
	return PGTel_ListSortMode(wk);
}

/**
 *	@brief	ポケギア電話　リストソート　選択待ち
 */
static int telseq_ListSort(PGTEL_SYS_WORK* wk)
{
	return PGTel_ListSort(wk);
}

/**
 *	@brief	ポケギア電話　会話メッセージセット
 */
static int telseq_TalkSet(PGTEL_SYS_WORK* wk)
{
	PGTel_TalkBegin(wk);
	return PGTEL_SEQ_TALK_START;
}

/**
 *	@brief	ポケギア電話　会話メッセージセット
 */
static int telseq_TalkStart(PGTEL_SYS_WORK* wk)
{
	PGTel_TalkDataSet(wk);
	return PGTEL_SEQ_TALK_WAIT;
}

/*
 *	@brief	ポケギア電話　会話メッセージ再生
 */
static int telseq_TalkWait(PGTEL_SYS_WORK* wk)
{
	if(!PMTelSeq_TalkPlay(wk->pTelSys)){
		return PGTEL_SEQ_TALK_WAIT;
	}
	PGTel_TalkEnd(wk);
	return PGTEL_SEQ_MAIN;
}

/*
 *	@brief	ポケギア電話　会話メッセージ再生
 */
static int telseq_TalkEnd(PGTEL_SYS_WORK* wk)
{
	if(PGTel_CallendMsgWrite(wk) == 0){
		return PGTEL_SEQ_TALK_END;
	}
	GF_BGL_BmpWinDataFill(&(wk->win[WIN_MSG]),0x00);
	GF_BGL_BmpWinDataFill(&(wk->win[WIN_NAME]),0x00);
	GF_BGL_BmpWinOn(&(wk->win[WIN_MSG]));
	GF_BGL_BmpWinOn(&(wk->win[WIN_NAME]));

	MsgPrintTouchPanelFlagSet(MSG_TP_OFF);
	PGTelSub_ResetListStatus(wk);
	return PGTEL_SEQ_MAIN;
}

/**
 *	@brief	ポケギア電話　フェードイン
 */
static int telseq_AllFadeIn(PGTEL_SYS_WORK* wk)
{
	if(PGTel_AllFadeIn(wk)){
		wk->main_seq = 0;
		if(wk->is_call){
			return PGTEL_SEQ_TALK_START;
		}else{
			return PGTEL_SEQ_MAIN;
		}
	}
	return PGTEL_SEQ_ALL_FADEIN;
}
/**
 *	@brief	ポケギア電話　フェードアウト
 */
static int telseq_AllFadeOut(PGTEL_SYS_WORK* wk)
{
	int i;
	switch(wk->main_seq){
	case 0:
		WIPE_SYS_Start(WIPE_PATTERN_WMS,
				WIPE_TYPE_FADEOUT,
				WIPE_TYPE_FADEOUT,0x0000,COMM_BRIGHTNESS_SYNC,1,wk->heapID
				);
		wk->main_seq++;
		break;
	case 1:
		if(!WIPE_SYS_EndCheck()){
			break;
		}
		//BGの表示をOffにする
		for(i = 0;i < 8;i++){
			GF_BGL_VisibleSet(GF_BGL_FRAME0_M+i,VISIBLE_OFF);
		}
		wk->main_seq = 0;
		return PGTEL_SEQ_END;
	}

	return PGTEL_SEQ_ALL_FADEOUT;
}

/**
 *	@brief	ポケギア電話　アプリ切替フェードイン
 */
static int telseq_ViewFadeIn(PGTEL_SYS_WORK* wk)
{
	int i;

	switch(wk->main_seq){
	case 0:
		PaletteTrans_AutoSet(wk->sys->palAnm,TRUE);

		//Brightnessを解除する
		SetBrightness(BRIGHTNESS_NORMAL,
				(PLANEMASK_BG1 | PLANEMASK_BG2 | PLANEMASK_BG3),MASK_MAIN_DISPLAY);

		//BG123の表示をOnにする
		for(i = 0;i < 3;i++){
			GF_BGL_VisibleSet(GF_BGL_FRAME1_M+i,VISIBLE_ON);
			GF_BGL_VisibleSet(GF_BGL_FRAME1_S+i,VISIBLE_ON);
		}
		wk->sys->palEvy = 0;
		wk->main_seq++;
		break;
	case 1:
		if(!PGFrame_MainPalFadeWait(wk->sys,0)){
			break;
		}
		wk->main_seq++;
		break;
	case 2:
		PaletteTrans_AutoSet(wk->sys->palAnm,FALSE);
		wk->sys->palEvy = 0;
		wk->main_seq = 0;
		return PGTEL_SEQ_MAIN;
	}

	return PGTEL_SEQ_VIEW_FADEIN;
}
/**
 *	@brief	ポケギア電話　アプリ切替フェードアウト
 */
static int telseq_ViewFadeOut(PGTEL_SYS_WORK* wk)
{
	int i;

	switch(wk->main_seq){
	case 0:
		PaletteTrans_AutoSet(wk->sys->palAnm,TRUE);
		wk->sys->palEvy = 0;
		wk->main_seq++;
		break;
	case 1:
		if(!PGFrame_MainPalFadeWait(wk->sys,1)){
			break;
		}
		wk->main_seq++;
		break;
	case 2:
		//アプリ用パレットを塗りつぶす
		SoftFadePfd(wk->sys->palAnm,FADE_MAIN_BG,16*PGAPP_PALIDX_M,16*PGAPP_PALNUM_M,16,0x0000);
		SoftFadePfd(wk->sys->palAnm,FADE_MAIN_OBJ,16*PGAPPOAM_PALIDX_M,16*PGAPPOAM_PALNUM_M,16,0x0000);
		PaletteFadeTrans( wk->sys->palAnm );

		//BG123の表示をOffにする
		for(i = 0;i < 3;i++){
			GF_BGL_VisibleSet(GF_BGL_FRAME1_M+i,VISIBLE_OFF);
			GF_BGL_VisibleSet(GF_BGL_FRAME1_S+i,VISIBLE_OFF);
		}
		wk->main_seq++;
		break;
	case 3:
		PaletteTrans_AutoSet(wk->sys->palAnm,FALSE);
		wk->sys->palEvy = 0;
		wk->main_seq = 0;
		return PGTEL_SEQ_END;
	}

	return PGTEL_SEQ_VIEW_FADEOUT;
}